package csm.common.dateTime;

import java.text.*;

/**
 * 음력의 월력을 처리하는 클래스입니다.
 * 
 * @author seungmun
 * @since 2006.1.18.
 * 
 */
public class LunaDate
{
	/** 양력의 월별 날수*/
	private int DayOfMonth[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

	/** 인덱스 숫자의 합 */
	private int LunarDataNumberDay[] = { 29, 30, 58, 59, 59, 60 };

	@SuppressWarnings("unused")
	private static String[]	lunarYearLabel			= { "갑자", "을축", "병인", "정묘",
			"무진", "기사", "경오", "신미", "임신", "계유", "갑술", "을해", "병자", "정축", "무인",
			"기묘", "경진", "신사", "임오", "계미", "갑신", "을유", "병술", "정해", "무자", "기축",
			"경인", "신묘", "임진", "계사", "갑오", "을미", "병신", "정유", "무술", "기해", "경자",
			"신축", "임인", "계묘", "갑진", "을사", "병오", "정미", "무신", "기유", "경술", "신해",
			"임자", "계축", "갑인", "을묘", "병진", "정사", "무오", "기미", "경신", "신유", "임술",
			"계해"};
	
	/**
	 * 2050년까지의 음력월력표
	 * <pre>
	 * 1 : 작(29일),
	 * 2 : 큰(30일),
	 * 3 : 작작(윤달 - 29일,29일),
	 * 4 : 작큰(윤달 - 29일,30일),
	 * 5 : 큰작(윤달 - 30일,29일),
	 * 6 : 큰큰(윤달 - 30일,30일)
	 * </pre>
	 */
	private int	LunarData[][] = {
			/* 1900 ~ 1910 까지 */
			{ 1, 2, 1, 1, 2, 1, 2, 5, 2, 2, 1, 2, 384 },
			{ 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 354 },
			{ 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 355 },
			{ 1, 2, 1, 2, 1, 3, 2, 1, 1, 2, 2, 1, 383 },
			{ 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 354 },
			{ 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 2, 355 },
			{ 1, 2, 2, 4, 1, 2, 1, 2, 1, 2, 1, 2, 384 },
			{ 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 354 },
			{ 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 355 },
			{ 1, 5, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2, 384 },
			{ 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 354 },
			/* 1911 ~ 1920 까지 */
			{ 2, 1, 2, 1, 1, 5, 1, 2, 2, 1, 2, 2, 384 },
			{ 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 354 },
			{ 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 354 },
			{ 2, 2, 1, 2, 5, 1, 2, 1, 2, 1, 1, 2, 384 },
			{ 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 355 },
			{ 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 354 },
			{ 2, 3, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 384 },
			{ 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2, 355 },
			{ 1, 2, 1, 1, 2, 1, 5, 2, 2, 1, 2, 2, 384 },
			{ 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 354 },
			/* 1921 ~ 1930 까지 */
			{ 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 354 },
			{ 2, 1, 2, 2, 3, 2, 1, 1, 2, 1, 2, 2, 384 },
			{ 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 354 },
			{ 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1, 354 },
			{ 2, 1, 2, 5, 2, 1, 2, 2, 1, 2, 1, 2, 385 },
			{ 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 354 },
			{ 2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 355 },
			{ 1, 5, 1, 2, 1, 1, 2, 2, 1, 2, 2, 2, 384 },
			{ 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 354 },
			{ 1, 2, 2, 1, 1, 5, 1, 2, 1, 2, 2, 1, 383 },
			/* 1931 ~ 1940 까지 */
			{ 2, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 354 },
			{ 2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 355 },
			{ 1, 2, 2, 1, 6, 1, 2, 1, 2, 1, 1, 2, 384 },
			{ 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 355 },
			{ 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 354 },
			{ 2, 1, 4, 1, 2, 1, 2, 1, 2, 2, 2, 1, 384 },
			{ 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 354 },
			{ 2, 2, 1, 1, 2, 1, 4, 1, 2, 2, 2, 1, 384 },
			{ 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 2, 354 },
			{ 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 354 },
			/* 1941 ~ 1950 까지 */
			{ 2, 2, 1, 2, 2, 4, 1, 1, 2, 1, 2, 1, 384 },
			{ 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 355 },
			{ 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 355 },
			{ 1, 1, 2, 4, 1, 2, 1, 2, 2, 1, 2, 2, 384 },
			{ 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 354 },
			{ 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 354 },
			{ 2, 5, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 384 },
			{ 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 354 },
			{ 2, 2, 1, 2, 1, 2, 3, 2, 1, 2, 1, 2, 384 },
			{ 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 354 },
			/* 1951 ~ 1960 까지 */
			{ 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 355 },
			{ 1, 2, 1, 2, 4, 2, 1, 2, 1, 2, 1, 2, 384 },
			{ 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 2, 355 },
			{ 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 354 },
			{ 2, 1, 4, 1, 1, 2, 1, 2, 1, 2, 2, 2, 384 },
			{ 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 354 },
			{ 2, 1, 2, 1, 2, 1, 1, 5, 2, 1, 2, 2, 384 },
			{ 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 354 },
			{ 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 354 },
			{ 2, 1, 2, 1, 2, 5, 2, 1, 2, 1, 2, 1, 384 },
			/* 1961 ~ 1970 까지 */
			{ 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 355 },
			{ 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 354 },
			{ 2, 1, 2, 3, 2, 1, 2, 1, 2, 2, 2, 1, 384 },
			{ 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 355 },
			{ 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 353 },
			{ 2, 2, 5, 2, 1, 1, 2, 1, 1, 2, 2, 1, 384 },
			{ 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 2, 355 },
			{ 1, 2, 2, 1, 2, 1, 5, 2, 1, 2, 1, 2, 384 },
			{ 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 354 },
			{ 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 355 },
			/* 1971 ~ 1980 까지 */
			{ 1, 2, 1, 1, 5, 2, 1, 2, 2, 2, 1, 2, 384 },
			{ 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 354 },
			{ 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 2, 1, 354 },
			{ 2, 2, 1, 5, 1, 2, 1, 1, 2, 2, 1, 2, 384 },
			{ 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 354 },
			{ 2, 2, 1, 2, 1, 2, 1, 5, 2, 1, 1, 2, 384 },
			{ 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 354 },
			{ 2, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 355 },
			{ 2, 1, 1, 2, 1, 6, 1, 2, 2, 1, 2, 1, 384 },
			{ 2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 355 },
			/* 1981 ~ 1990 까지 */
			{ 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 354 },
			{ 2, 1, 2, 3, 2, 1, 1, 2, 2, 1, 2, 2, 384 },
			{ 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 354 },
			{ 2, 1, 2, 2, 1, 1, 2, 1, 1, 5, 2, 2, 384 },
			{ 1, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 354 },
			{ 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1, 354 },
			{ 2, 1, 2, 2, 1, 5, 2, 2, 1, 2, 1, 2, 385 },
			{ 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 354 },
			{ 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 2, 355 },
			{ 1, 2, 1, 1, 5, 1, 2, 1, 2, 2, 2, 2, 384 },
			/* 1991 ~ 2000 까지 */
			{ 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 354 },
			{ 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 354 },
			{ 1, 2, 5, 2, 1, 2, 1, 1, 2, 1, 2, 1, 383 },
			{ 2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 355 },
			{ 1, 2, 2, 1, 2, 2, 1, 5, 2, 1, 1, 2, 384 },
			{ 1, 2, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2, 355 },
			{ 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 354 },
			{ 2, 1, 1, 2, 3, 2, 2, 1, 2, 2, 2, 1, 384 },
			{ 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 354 },
			{ 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 354 },
			/* 2001 ~ 2010 까지 */
			{ 2, 2, 2, 3, 2, 1, 1, 2, 1, 2, 1, 2, 384 },
			{ 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 354 },
			{ 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 355 },
			{ 1, 5, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 384 },
			{ 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1, 354 },
			{ 2, 1, 2, 1, 2, 1, 5, 2, 2, 1, 2, 2, 385 },
			{ 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 354 },
			{ 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 354 },
			{ 2, 2, 1, 1, 5, 1, 2, 1, 2, 1, 2, 2, 384 },
			{ 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 354 },
			/* 2011 ~ 2020 까지 */
			{ 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 354 },
			{ 2, 1, 6, 2, 1, 2, 1, 1, 2, 1, 2, 1, 384 },
			{ 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 355 },
			{ 1, 2, 1, 2, 1, 2, 1, 2, 5, 2, 1, 2, 384 },
			{ 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 2, 355 },
			{ 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 354 },
			{ 2, 1, 1, 2, 3, 2, 1, 2, 1, 2, 2, 2, 384 },
			{ 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 354 },
			{ 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 354 },
			{ 2, 1, 2, 5, 2, 1, 1, 2, 1, 2, 1, 2, 384 },
			/* 2021 ~ 2030 까지 */
			{ 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1, 354 },
			{ 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 355 },
			{ 1, 5, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 384 },
			{ 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 354 },
			{ 2, 1, 2, 1, 1, 5, 2, 1, 2, 2, 2, 1, 384 },
			{ 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 355 },
			{ 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 2, 354 },
			{ 1, 2, 2, 1, 5, 1, 2, 1, 1, 2, 2, 1, 383 },
			{ 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2, 355 },
			{ 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 354 },
			/* 2031 ~ 2040 까지 */
			{ 2, 1, 5, 2, 1, 2, 2, 1, 2, 1, 2, 1, 384 },
			{ 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 355 },
			{ 1, 2, 1, 1, 2, 1, 5, 2, 2, 2, 1, 2, 384 },
			{ 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 354 },
			{ 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 354 },
			{ 2, 2, 1, 2, 1, 4, 1, 1, 2, 1, 2, 2, 384 },
			{ 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 354 },
			{ 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1, 354 },
			{ 2, 2, 1, 2, 5, 2, 1, 2, 1, 2, 1, 1, 384 },
			{ 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 355 },
			/* 2041 ~ 2050 까지 */
			{ 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 355 },
			{ 1, 5, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 384 },
			{ 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2, 354 },
			{ 2, 1, 2, 1, 1, 2, 3, 2, 1, 2, 2, 2, 384 },
			{ 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 354 },
			{ 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 354 },
			{ 2, 1, 2, 2, 4, 1, 2, 1, 1, 2, 1, 2, 384 },
			{ 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 1, 1, 353 },
			{ 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 355 },
			{ 2, 1, 4, 1, 2, 1, 2, 2, 1, 2, 2, 1, 384 } };

	/**
	 * 해당연도가 윤년인지 여부를 체크합니다.
	 * 
	 * @param year
	 *            확인할 년도값
	 * @return True-윤년, False-윤년이 아님.
	 */
	public boolean isYunYear(int year)
	{
		if (((year % 4) == 0) && ((year % 100 != 0) || (year % 400 == 0))) return true;
		return false;
	}

	/**
	 * 양력의 총날짜수를 돌려줍니다.
	 * 
	 * @param year
	 *            년도값
	 * @param month
	 *            월값
	 * @param day
	 *            일값
	 * @return 양력의 총날짜수
	 */
	public long countSolarDay(int year, int month, int day)
	{
		int i, j = 0;
		long AllCount = 366;

		// 입력된 년도의 이전년도까지의 총일수를 계산한다.
		for (i = 1; i <= year - 1; i++)
		{
			if (isYunYear(i))
			{
				AllCount += 366;
				continue;
			}
			AllCount += 365;
		}
		// 입력된 년도의 입력된 월의 전월까지의 총일수를 계산한다.
		for (j = 1; j <= month - 1; j++)
		{
			// 2월이면 윤년체크를 해야한다.
			if (j == 2)
			{
				if (isYunYear(year))
				{
					AllCount += 29;
					continue;
				}
				AllCount += DayOfMonth[j - 1];
				continue;
			}
			// 2월이 아니면 윤년체크를 하지 않아도 된다.
			AllCount += DayOfMonth[j - 1];
		}
		AllCount += day;
		return AllCount;
	}

	/**
	 * 음력의 총날짜수를 반환합니다. 만약 반환할수 없는 날이라면 0을 돌려줍니다.
	 * 
	 * @param year
	 * @param month
	 * @param day
	 * @param isLeap
	 *            윤년인지 여부
	 * @return 음력의 총날짜수(만약 반환할수 없는 날이라면 0)
	 */
	public long countLunarDay(int year, int month, int day, boolean isLeap)
	{
		long AllCount = 0;
		long ResultValue = 0;
		int i = 0;
		year -= 1900;
		AllCount += countSolarDay(1900, 1, 30);

		if (year >= 0)
		{
			for (i = 0; i <= year - 1; i++)
			{
				AllCount += LunarData[i][12];
			}
			for (i = 0; i <= month - 2; i++)
			{
				AllCount += LunarDataNumberDay[LunarData[year][i] - 1];
			}
			if (!isLeap)
			{
				AllCount += day;
			}
			else
			{
				if (LunarData[year][month - 1] == 1 || LunarData[year][month - 1] == 2)
				{
					AllCount += day;
				}
				else if (LunarData[year][month - 1] == 3 || LunarData[year][month - 1] == 4)
				{
					AllCount += day + 29;
				}
				else if (LunarData[year][month - 1] == 5 || LunarData[year][month - 1] == 6)
				{
					AllCount += day + 30;
				}
			}
			ResultValue = AllCount;
		}
		else
		{
			ResultValue = 0;
		}
		return ResultValue;
	}

	/**
	 * 양력날수를 이용하여 음력날짜를가져옵니다.
	 * 
	 * @param allCountDay
	 *            특정양력날짜의 총날수
	 * @return
	 */
	public String countToDateForLunar(long allCountDay)
	{
		long AllCount = 0;
		int Year, Month, Day = 0;
		// {LDNC : Lunar Data Number Count}
		boolean RepeatStop;
		boolean LeapValue;
		@SuppressWarnings("unused")
		boolean Leap = false;
		@SuppressWarnings("unused")
		String dateOfLunar = "";

		Year = 0;
		Month = 1;
		Day = 0;
		LeapValue = false;
		RepeatStop = false;

		AllCount = allCountDay;
		AllCount -= countSolarDay(1900, 1, 30);

		do
		{
			if (AllCount > LunarData[Year][12])
			{
				AllCount -= LunarData[Year][12];
				Year += 1; // 년 계산
			}
			else
			{
				if (AllCount > LunarDataNumberDay[LunarData[Year][Month - 1] - 1])
				{
					// 월계산
					AllCount -= LunarDataNumberDay[LunarData[Year][Month - 1] - 1];
					Month += 1;
				}
				else
				{
					if (LunarData[Year][Month - 1] == 1 || LunarData[Year][Month - 1] == 2)
					{
						Day = Integer.parseInt(Long.toString(AllCount));
					}
					else if (LunarData[Year][Month - 1] == 3 || LunarData[Year][Month - 1] == 4)
					{
						if (AllCount <= 29)
						{
							Day = Integer.parseInt(Long.toString(AllCount));
						}
						else
						{
							Day = Integer.parseInt(Long.toString(AllCount)) - 29;
							LeapValue = true;
						}
					}
					else if (LunarData[Year][Month - 1] == 5 || LunarData[Year][Month - 1] == 6)
					{
						if (AllCount <= 30)
						{
							Day = Integer.parseInt(Long.toString(AllCount));
						}
						else
						{
							Day = Integer.parseInt(Long.toString(AllCount)) - 30;
							LeapValue = true;
						}
					}
					// System.out.println("3-2 : " + Year + "/" + Month + "-" +
					// LunarDataNumberDay[LunarData[Year][Month-1]-1] + " : " +
					// AllCount);
					RepeatStop = true;
				}
			}
		} while (!RepeatStop);

		NumberFormat nf = NumberFormat.getNumberInstance();
		nf.setMinimumIntegerDigits(2);

		Leap = LeapValue;

		String returnLunar = Long.toString(Year + 1900) + "/" + nf.format(Integer.parseInt(Long.toString(Month))) + "/" + nf.format(Integer.parseInt(Long.toString(Day)));
		// System.out.println("음력일자 : " + returnLunar);
		return returnLunar;
	}

	/**
	 * 음력날수를 이용하여 양력날짜를 가져옵니다.
	 * 
	 * @param allCountDay
	 *            특정 음력날짜의 총 날수
	 * @return
	 */
	public String countToDateForSolar(long allCountDay)
	{
		int Year, Month = 0;
		boolean YearRepeatStop, MonthRepeatStop;
		YearRepeatStop = false;
		MonthRepeatStop = false;
		Year = 0;
		Month = 1;
		do
		{
			if (isYunYear(Year))
			{
				if (allCountDay > 366)
				{
					allCountDay -= 366;
					Year += 1;
				}
				else
				{
					YearRepeatStop = true;
				}
			}
			else
			{
				if (allCountDay > 365)
				{
					allCountDay -= 365;
					Year += 1;
				}
				else
				{
					YearRepeatStop = true;
				}
			}
			// System.out.println(Year + " : " + AllCountDay + " - " +
			// YearRepeatStop);
		} while (!YearRepeatStop);

		do
		{
			if (Month == 2)
			{
				if (isYunYear(Year))
				{
					if (allCountDay > 29)
					{
						allCountDay -= 29;
						Month += 1;
					}
					else
					{
						MonthRepeatStop = true;
					}
				}
				else
				{
					if (allCountDay > 28)
					{
						allCountDay -= 28;
						Month += 1;
					}
					else
					{
						MonthRepeatStop = true;
					}
				}
			}
			else
			{
				if (allCountDay > DayOfMonth[Month - 1])
				{
					allCountDay -= DayOfMonth[Month - 1];
					Month += 1;
				}
				else
				{
					MonthRepeatStop = true;
				}
			}
			// System.out.println(Month + " : " + AllCountDay + " - " +
			// MonthRepeatStop);
		} while (!MonthRepeatStop);

		NumberFormat nf = NumberFormat.getNumberInstance();
		nf.setMinimumIntegerDigits(2);

		String returnLunar = Long.toString(Year) + "/" + nf.format(Integer.parseInt(Long.toString(Month))) + "/" + nf.format(Integer.parseInt(Long.toString(allCountDay)));
		// System.out.println("음력일자 : " + returnLunar);
		return returnLunar;
	}

	/**
	 * 양력날짜를 입력받아 음력날짜를 가져옵니다.
	 * 
	 * @param year
	 * @param month
	 * @param day
	 * @return 음력날짜 (예:1900/01/01)
	 */
	public static String toLunaDate(int year, int month, int day)
	{
		LunaDate luna = new LunaDate();
		long solarDaySum = luna.countSolarDay(year, month, day);
		String lunaDateString = luna.countToDateForLunar(solarDaySum);
		return lunaDateString;
	}

	/**
	 * 음력날짜를 입력받아 양력날짜를 가져옵니다.
	 * 
	 * @param year
	 * @param month
	 * @param day
	 * @return 양력날짜 (예:1900/01/01)
	 */
	public static String toSolarDate(int year, int month, int day)
	{
		LunaDate luna = new LunaDate();
		long lunaDaySum = luna.countLunarDay(year, month, day, luna.isYunYear(year));
		String solarDateString = luna.countToDateForSolar(lunaDaySum);
		return solarDateString;
	}

	public static void main(String[] args)
	{
		try
		{
			LunaDate luna = new LunaDate();

			System.out.print("1975년은 윤년");
			if (luna.isYunYear(1975))
				System.out.println("입니다.");
			else
				System.out.println("이 아닙니다.");

			// 양력 1975년 4월 12일 의 음력날짜를 구해보자.

			long solarDaySum = luna.countSolarDay(1975, 4, 12);
			String lunaDateString = luna.countToDateForLunar(solarDaySum);

			System.out.println("양력 1975년 4월 12일 의 음력날짜는" + lunaDateString + "입니다");

			// 음력 1975년 3월 1일의 양력날짜를 구해보자.
			long lunaDaySum = luna.countLunarDay(1975, 3, 1, luna.isYunYear(1975));
			String solarDateString = luna.countToDateForSolar(lunaDaySum);
			System.out.println("음력 1975년 3월 1일 의 양력날짜는" + solarDateString + "입니다");

		}
		catch (Exception e)
		{
			e.printStackTrace();
		}

	}
}
